package exercises.leetcode;

import exercises.newcoder.util.TreeNode;

import java.util.LinkedList;

/**
 * <a href="https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst/">
 * 230. 二叉搜索树中第K小的元素</a>
 *
 * <p><span color="#87CEEB">描述:</span>
 * 给定一个二叉搜索树的根节点 root ，和一个整数 k ，请你设计一个算法查找其中第 k 个最小元素（从 1 开始计数）。
 * <p>
 * <img src="https://assets.leetcode.com/uploads/2021/01/28/kthtree1.jpg">
 * <p>
 * 示例 1：
 * <p>
 * <p>
 * 输入：root = [3,1,4,null,2], k = 1
 * 输出：1
 * <p>
 * 示例 2：
 * <p>
 * <img src="https://assets.leetcode.com/uploads/2021/01/28/kthtree2.jpg">
 * <p>
 * 输入：root = [5,3,6,2,4,null,null,1], k = 3
 * 输出：3
 *  
 * <p>
 *  
 * <p>
 * 提示：
 * <ul>
 * <li>树中的节点数为 n 。</li>
 * <li>1 <= k <= n <= 104</li>
 * <li>0 <= Node.val <= 104</li>
 *  
 * </ul>
 * 进阶：如果二叉搜索树经常被修改（插入/删除操作）并且你需要频繁地查找第 k 小的值，你将如何优化算法？
 *
 * @author or2
 * @date 2021年10月07日 时间: 8:39
 */
public class No230 {
    public int kthSmallest(TreeNode root, int k) {
        var stack = new LinkedList<TreeNode>();

        while (true) {
            while (root != null) {
                stack.push(root);
                root = root.left;
            }

            root = stack.pop();
            if (--k == 0)
                return root.val;
            root = root.right;
        }
    }
}
